/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package traspasos.beans;

import abstractClasses.AbstractListadoEntidades;
import entities.Almacen;
import entities.EnvioTraspasoMercancia;
import entities.EstadoRecepcion;
import entities.PeticionTraspasoMercancia;
import entities.RecepcionTraspasoMercancia;
import entities.TipoTraspaso;
import entities.Usuario;
import entities.interfaces.TraspasoInterfaz;
import facades.EnvioTraspasoMercanciaFacade;
import facades.PeticionTraspasoMercanciaFacade;
import facades.RecepcionTraspasoMercanciaFacade;
import javax.inject.Named;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.enterprise.event.Event;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.transaction.Transactional;
import qualifiers.Recurso;
import qualifiers.UsuarioLogeado;
import traspasos.qualifiers.EventoSolucionarIncidenciaEnviarPerdidas;
import traspasos.qualifiers.EventoSolucionarIncidenciaFalloReceptor;

/**
 *
 * @author damfercer
 */
@Named(value = "traspasosBean")
@ViewScoped
public class TraspasosBean extends AbstractListadoEntidades<TraspasoInterfaz, PeticionTraspasoMercanciaFacade> implements Serializable {
    @Inject
    @UsuarioLogeado
    private Usuario usuario;
    @Inject
    private EnvioTraspasoMercanciaFacade envioFacade;
    @Inject
    private RecepcionTraspasoMercanciaFacade recepcionFacade;
    @Inject
    @Recurso
    private List<Almacen> almacenes;
    List<PeticionTraspasoMercancia> peticionesOrigenUsuario;
    List<PeticionTraspasoMercancia> peticionesDestinoUsuario;
    List<EnvioTraspasoMercancia> enviosOrigenUsuario;
    List<EnvioTraspasoMercancia> enviosDestinoUsuario;
    List<RecepcionTraspasoMercancia> recepcionesOrigenUsuario;
    @Inject
    @EventoSolucionarIncidenciaEnviarPerdidas
    Event<RecepcionTraspasoMercancia> eventoEnviarPerdidas;
    @Inject
    @EventoSolucionarIncidenciaFalloReceptor
    Event<RecepcionTraspasoMercancia> eventoFalloReceptor;
    
    public TraspasosBean() {
    }
    
    @PostConstruct
    @Override
    public void init(){
        setFacade(getEntityFacadeInstance().get());
        setListadoEntidades(getTraspasosUsuario());
    }
    
    
    private List<TraspasoInterfaz> getTraspasosUsuario(){
        Set<TraspasoInterfaz> lineas=new HashSet<TraspasoInterfaz>();
        if(usuario.getTipoUsuario().getDescripcion().equals("ADMIN") || usuario.getTipoUsuario().getDescripcion().equals("DIRECCION") || usuario.getTipoUsuario().getDescripcion().equals("LOGISTICA")){
            peticionesOrigenUsuario=getFacade().getPeticionesTraspasoMercancia(almacenes);
            peticionesDestinoUsuario=getFacade().getPeticionesTraspasoMercanciaDestino(almacenes);
            enviosOrigenUsuario=envioFacade.getEnviosTraspasoMercancia(almacenes);
            enviosDestinoUsuario=envioFacade.getEnviosTraspasoMercanciaDestino(almacenes);
            recepcionesOrigenUsuario=recepcionFacade.getRecepcionesTraspasoMercancia(almacenes);
        }
        else{
            peticionesOrigenUsuario=getFacade().getPeticionesTraspasoMercancia(usuario.getAlmacenesDeUsuario());
            peticionesDestinoUsuario=getFacade().getPeticionesTraspasoMercanciaDestino(usuario.getAlmacenesDeUsuario());
            enviosOrigenUsuario=envioFacade.getEnviosTraspasoMercancia(usuario.getAlmacenesDeUsuario());
            enviosDestinoUsuario=envioFacade.getEnviosTraspasoMercanciaDestino(usuario.getAlmacenesDeUsuario());
            recepcionesOrigenUsuario=recepcionFacade.getRecepcionesTraspasoMercancia(usuario.getAlmacenesDeUsuario());
        }
        lineas.addAll(peticionesOrigenUsuario);
        lineas.addAll(peticionesDestinoUsuario);
        lineas.addAll(enviosOrigenUsuario);
        lineas.addAll(enviosDestinoUsuario);
        lineas.addAll(recepcionesOrigenUsuario);
        return new ArrayList<TraspasoInterfaz>(lineas);
    }
    
    //LÓGICA PETICIONES
    public Boolean getPuedeEditarPeticionTraspasoMercancia(){
        return getEntidadElegida().getTipo().toString().equals(TipoTraspaso.PETICION.toString()) && peticionesOrigenUsuario.contains((PeticionTraspasoMercancia)getEntidadElegida());
    }
    
    public Boolean getPuedeCrearNuevoEnvio(){
        return getEntidadElegida().getTipo().toString().equals(TipoTraspaso.PETICION.toString()) && peticionesDestinoUsuario.contains((PeticionTraspasoMercancia)getEntidadElegida());
    }
    
    public String irANuevaPeticionTraspasoMercancia(){
        return "/views/tienda/NuevaPeticionTraspasoMercancia?faces-redirect=true";
    }
    
    public String irAEditarPeticionTraspasoMercancia(){
        return "/views/tienda/EditarPeticionTraspasoMercancia?faces-redirect=true";
    }
    
    public String irANuevoEnvio(){
        return "/views/tienda/NuevoEnvioTraspasoMercancia?faces-redirect=true";
    }
    
    //LÓGICA ENVÍOS
    public Boolean getPuedeVerEnvioTraspasoMercancia(){
        return getEntidadElegida().getTipo().toString().equals(TipoTraspaso.ENVIO.toString());
    }
    
    public Boolean getPuedeCrearRecepcion(){
        return getEntidadElegida().getTipo().toString().equals(TipoTraspaso.ENVIO.toString()) && enviosDestinoUsuario.contains((EnvioTraspasoMercancia)getEntidadElegida());
    }
    
    public String irAVerEnvio(){
        return "/views/tienda/VerEnvioTraspasoMercancia?faces-redirect=true";
    }
    
    public String irANuevaRecepcion(){
        return "/views/tienda/NuevaRecepcionTraspasoMercancia?faces-redirect=true";
    }
    
    //LÓGICA RECEPCIÓN
    public Boolean getPuedeVerRecepcionTraspasoMercancia(){
        return getEntidadElegida().getTipo().toString().equals(TipoTraspaso.RECEPCION.toString());
    }
    
    public String irAVerRecepcion(){
        return "/views/tienda/VerRecepcionTraspasoMercancia?faces-redirect=true";
    }
    
    public Boolean getPuedeResolverIncidencia(){
        return (usuario.getTipoUsuario().getDescripcion().equals("ADMIN") || usuario.getTipoUsuario().getDescripcion().equals("DIRECCION") || usuario.getTipoUsuario().getDescripcion().equals("LOGISTICA")) && getEntidadElegida()!=null && getEntidadElegida().getTipo().equals(TipoTraspaso.RECEPCION.toString()) && getEntidadElegida().getEstado().equals(EstadoRecepcion.INCIDENCIA.toString());
    }
    
    @Transactional
    public void resolverIncidenciaMandarAPerdidas(){
        ((RecepcionTraspasoMercancia)getEntidadElegida()).setOkIncidencia(Boolean.TRUE);
        recepcionFacade.edit((RecepcionTraspasoMercancia)getEntidadElegida());
        eventoEnviarPerdidas.fire((RecepcionTraspasoMercancia)getEntidadElegida());
    }
    
    @Transactional
    public void resolverIncidenciaFalloReceptor(){
        ((RecepcionTraspasoMercancia)getEntidadElegida()).setOkIncidencia(Boolean.TRUE);
        recepcionFacade.edit((RecepcionTraspasoMercancia)getEntidadElegida());
        eventoFalloReceptor.fire((RecepcionTraspasoMercancia)getEntidadElegida());
    }
    
}
